;-----------------------------------------------------------------------------
;   spr_fmat.src -- SPR ライブラリ FMAT モジュール
;   Copyright(c) 1994 SEGA
;   Written by T.S on 1994-01-24 Ver.0.80
;   Updated by H.E on 1994-02-15 Ver.0.80
;
;   このライブラリは透視変換処理モジュールで、
;   以下のルーチンを含む。
;
;   MTH_Pers2D              -  透視変換処理
;   MTH_ComputeBright       -  ポリゴンの隠面判定と輝度計算
;
;-----------------------------------------------------------------------------
;
	.EXPORT _MTH_Pers2D
	.EXPORT _MTH_ComputeBright
	.SECTION SEGA_P,CODE,ALIGN=4
;
;-----------------------------------------------------------------------------
;
;  NAME : MTH_Pers2D  -  Persepect 3D to 2D
;
;        void  MTH_Pers2D(MthXyz *p3d, MthXy *unitPixel, XyInt *p2d);
; 
;  PARAMETERS
; 
;  　　(1) MthXyz   *p3d        - <i> R4 視点座標系３Ｄ頂点座標
;  　　(2) MthXy    *unitPixel  - <i> R5 スクリーンＸＹの単位ピクセル数
;  　　(3) XyInt    *p2d        - <o> R6 透視変換後スクリーン２Ｄ座標
; 
;  DESCRIPTION
; 
; 	視点座標系の原点を視点として -1.0 のところにスクリーンを設定して３Ｄ
;       から２Ｄへの透視変換を行う。スクリーン上で 1.0 の大きさがスクリーン
;       ＸＹの単位ピクセル数に対応する。
; 
;  POSTCONDITIONS
; 
;  CAVEATS
;  
;-----------------------------------------------------------------------------
;
	.ALIGN	4
_MTH_Pers2D:
 	STS.L	MACH,@-R15
 	STS.L	MACL,@-R15
;
; hz = MTH_Div(MTH_FIXED(1),p3d->z);
;
	MOV.L	A_DIV,R0           ;* FIXED(1) / p3d->z *
	MOV.L   @(8,R4),R1
	MOV.L	R1,@R0             ; <- p3d->z
	MOV.L	#1,R1
	MOV.L	R1,@(H'10,R0)      ; <- 0x00000001 (upper)
	MOV.L	#0,R1
	MOV.L	R1,@(H'14,R0)      ; <- 0x00000000 (lower)
;
; wx = MTH_Mul(p3d->x,unitPixel->x);
;
        MOV.L   @R4+,R1            ; R1 = p3d->x
        MOV.L   @R5+,R2            ; R2 = unitPixel->x
	DMULS.L R1,R2              ; MACH,L = R1 * R2
 	STS	MACH,R1
 	STS	MACL,R2            ; R1,R2 = MACH,MACL
 	XTRCT	R1,R2	           ; -> R2
;	
; wy = MTH_Mul(p3d->y,unitPixel->y);
;
        MOV.L   @R4+,R3            ; R3 = p3d->x
        MOV.L   @R5+,R4            ; R4 = unitPixel->x
	DMULS.L R3,R4              ; MACH,L = R3 * R4
 	STS	MACH,R3
 	STS	MACL,R4            ; R3,R4 = MACH,MACL
 	XTRCT	R3,R4	           ; -> R4
;	
 	MOV.L	@(H'14,R0),R1      ; -> R1 (= 1/z)
;
; p2d->x = MTH_FixedToInt(MTH_Mul(wx,hz));
;
	DMULS.L R1,R2              ; MACH,L = x * (1/z)
 	STS	MACH,R2
 	STS	MACL,R3            ; R1,R2 = MACH,MACL
 	XTRCT	R2,R0	           ; -> R3
	SHLR16	R0
	MOV.W	R0,@R6             ; R3 -> pers X
;
; p2d->y = MTH_FixedToInt(MTH_Mul(wy,hz));
;
	DMULS.L R1,R4              ; MACH,L = x * (1/z)
 	STS	MACH,R2
 	STS	MACL,R3            ; R1,R2 = MACH,MACL
 	XTRCT	R2,R0	           ; -> R3
 	LDS.L	@R15+,MACL
 	LDS.L	@R15+,MACH
	SHLR16	R0
	RTS
	MOV.W	R0,@(2,R6)         ; R3 -> pers Y
;
	.ALIGN	4
A_DIV	.DATA.L	H'FFFFFF00
;
;
;--------------------------------------------------------------------------
;
; NAME : MTH_ComputeBright  -  Compute Brightness
;
; PARAMETERS
;
; 　　(1) MthXyz   *lightVector   - <i> 光源ベクトル
; 　　(2) MthXyz   *normalVector  - <i> ポリゴンの法線ベクトル
;
; DESCRIPTION
;
;      光源ベクトルからポリゴン面の輝度を返す。
;
; POSTCONDITIONS
;
;      Sint32   bright  :  0（暗） から 31（明）
;
; CAVEATS
;
;-------------------------------------------------------------------------
;
	.ALIGN	4
_MTH_ComputeBright:
 	STS	MACH,R1
 	STS	MACL,R2
;
; product = MTH_Product((Fixed32*)normVector, (Fixed32*)lightVector);
;
	CLRMAC
	MAC.L   @R4+,@R5+
	MAC.L   @R4+,@R5+
	MAC.L   @R4+,@R5+
 	STS	MACH,R3
 	STS	MACL,R0
;
; color = MTH_FixedToInt((product + MTH_FIXED(1.0)) * (32/2));
;
	ADD	#1,R3
 	XTRCT	R3,R0	; xtract for Fixed32
	MOV	#16,R3
	DMULS.L R3,R0
 	STS	MACH,R3
 	STS	MACL,R0
	SHLR16	R0
;
; return  color & 0x1f;
;
 	LDS	R1,MACH
 	LDS	R2,MACL
	RTS
	AND	#H'1f,R0
	NOP
;
;---------------------------------------------------------------------
	.END
;---------------------------------------------------------------------
;   end of file
